package com.cx.proxy.dhcp;

import com.cx.proxy.coust.ILog;
import com.cx.proxy.coust.IUser;
import com.cx.proxy.coust.IUserImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author zhangshuai
 * @version V1.0
 * @Project Java2_26
 * @Package com.cx.proxy.dhcp
 * @Description:
 * @Date 2025/5/28 10:31
 */
//jdk动态代理
public class JDKDhcpProxy implements InvocationHandler {
    //jdk动态代理，目标对象与代理对象都要实现相同的接口，代理对象的创建是通过反射来实现的
    //创建目标对象
    private Object target;
    //构造器
    public JDKDhcpProxy(Object target) {
        this.target = target;
    }
    //代理对象去调用真实对象的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("开启jdk动态代理");
        ILog.doLog();
        //调用目标对象的方法
        Object invoke = method.invoke(target, args);
        System.out.println("关闭jdk动态代理");
        return invoke;
    }

    //获取代理对象
    public Object getJDKProxy(){

     return   Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);

    }

    public static void main(String[] args) {
        //获取真实对象
        IUser iUser = new IUserImpl();
        //获取代理对象
        IUser jdkProxy = (IUser) new JDKDhcpProxy(iUser).getJDKProxy();

        //代理对象去调用真实对象的方法
        jdkProxy.save();
        jdkProxy.update();
        jdkProxy.run();

    }
}